home *** CD-ROM | disk | FTP | other *** search
/ Cream of the Crop 11 / Cream of the Crop 11-2.iso / os2 / rsynth1.zip / darray.c < prev    next >
C/C++ Source or Header  |  1994-11-08  |  1KB  |  84 lines

  1. #include <config.h>
  2. /* $Id: darray.c,v 1.13 1994/11/08 13:30:50 a904209 Exp a904209 $
  3.  */
  4. char *darray_id = "$Id: darray.c,v 1.13 1994/11/08 13:30:50 a904209 Exp a904209 $";
  5. #include <useconfig.h>
  6. #include "proto.h"
  7. #include "darray.h"
  8.  
  9. void
  10. darray_free(a)
  11. darray_t *a;
  12. {
  13.  if (a->data)
  14.   {
  15.    free(a->data);
  16.    a->data = NULL;
  17.   }
  18.  a->items = a->alloc = 0;
  19. }
  20.  
  21. void *
  22. Darray_find(a, n)
  23. darray_t *a;
  24. unsigned n;
  25. {
  26.  if (n >= a->alloc || n >= a->items)
  27.   {
  28.    unsigned osize = a->items * a->esize;
  29.    unsigned nsize;
  30.    if (!a->esize)
  31.     abort();
  32.    if (n >= a->alloc)
  33.     {
  34.      unsigned add = (a->get) ? a->get : 1;
  35.      char *ndata = (char *) malloc(nsize = (n + add) * a->esize);
  36.      if (ndata)
  37.       {
  38.        if (osize)
  39.         memcpy(ndata, a->data, osize);
  40.        if (a->data)
  41.         free(a->data);
  42.        a->data = ndata;
  43.        a->alloc = n + add;
  44.       }
  45.      else
  46.       return NULL;
  47.     }
  48.    else
  49.     nsize = (n + 1) * a->esize;
  50.    if (n >= a->items)
  51.     {
  52.      memset(a->data + osize, 0, nsize - osize);
  53.      a->items = n + 1;
  54.     }
  55.   }
  56.  return (void *) (a->data + n * a->esize);
  57. }
  58.  
  59. int
  60. darray_delete(a, n)
  61. darray_t *a;
  62. unsigned n;
  63. {
  64.  char *p = (char *) darray_find(a, n);
  65.  if (p)
  66.   {
  67.    if (a->items)
  68.     {
  69.      a->items--;
  70.      while (n++ < a->items)
  71.       {
  72.        memcpy(p, p + a->esize, a->esize);
  73.        p += a->esize;
  74.       }
  75.      memset(p, 0, a->esize);
  76.      return 1;
  77.     }
  78.    else
  79.     abort();
  80.   }
  81.  else
  82.   return 0;
  83. }
  84.